home *** CD-ROM | disk | FTP | other *** search
Text File | 1992-09-08 | 3.5 KB | 97 lines | [TEXT/CCL2] |
- ;;;
- ;;; f-pt-in-scroll.lisp
- ;;;
-
- #|
- ================================================================
- Purpose ========================================================
- ================================================================
- Defines f-pt-in-scroll, a handy addition to sequence-dialog-items and
- fred-windows. Thanks to holz@urz.unibas.ch (Dieter Holz) for help with
- the fred-window version.
-
-
- ================================================================
- Status =========================================================
- ================================================================
- Implemented.
-
-
- ================================================================
- Change history =================================================
- ================================================================
- 18-Aug-92 mc Created.
- 07-Sep-92 mc Defined a f-pt-in-scroll method for fred-windows.
-
- |#
-
-
- (in-package "CCL")
-
- (export '(F-PT-IN-SCROLL)
- "CCL")
-
- ;;;
-
- (defgeneric f-pt-in-scroll (sequence-dialog-item pt-local-to-container)
- (:documentation "Returns non-nil when pt-local-to-container is in either
- sequence-dialog-item's vertical or horizontal scrollbar."))
-
-
- ;;; Define a method for sequence-dialog-items.
-
- (defmethod f-pt-in-scroll ((sequence-dialog-item sequence-dialog-item)
- (pt-local-to-container integer))
- (declare (optimize speed))
- ;;
- (let* ((f-h-scroll-bar (table-hscrollp sequence-dialog-item))
- (f-v-scroll-bar (table-vscrollp sequence-dialog-item))
- (pt-bot-right (add-points (view-position sequence-dialog-item)
- (view-size sequence-dialog-item)))
- (int-pt-h (point-h pt-local-to-container))
- (int-pt-v (point-v pt-local-to-container))
- (f-pt-in-v-scroll-bar (and f-v-scroll-bar
- (>= int-pt-h (- (point-h pt-bot-right) 16))))
- (f-pt-in-h-scroll-bar (and f-h-scroll-bar
- (>= int-pt-v (- (point-v pt-bot-right) 16)))))
- (or f-pt-in-v-scroll-bar f-pt-in-h-scroll-bar)))
-
-
- ;;; Define a method for fred-windows.
-
- #|
- (defmethod f-pt-in-scroll ((fred-window fred-window)
- (pt-local-to-container integer))
- (declare (optimize speed))
- ;;
- (let* ((h-ctl-record-vscroll (slot-value fred-window 'ccl::vscroll))
- (h-ctl-record-hscroll (slot-value fred-window 'ccl::hscroll)))
- (with-dereferenced-handles ((p-ctl-rec-vscroll h-ctl-record-vscroll)
- (p-ctl-rec-hscroll h-ctl-record-hscroll))
- (let* ((p-ctl-rect-vscroll
- (rref p-ctl-rec-vscroll :controlRecord.contrlRect :storage :pointer))
- (p-ctl-rect-hscroll
- (rref p-ctl-rec-hscroll :controlRecord.contrlRect :storage :pointer)))
- (let* ((f-pt-in-v-scroll-bar (#_PtInRect pt-local-to-container
- p-ctl-rect-vscroll))
- (f-pt-in-h-scroll-bar (#_PtInRect pt-local-to-container
- p-ctl-rect-hscroll)))
- (or f-pt-in-v-scroll-bar f-pt-in-h-scroll-bar))))))
- |#
-
- ;;; Following cleaner version based on code provided by holz@urz.unibas.ch
- ;;; (Dieter Holz) :
-
- (defmethod f-pt-in-scroll ((fred-window fred-window)
- (pt-local-to-container integer))
- (declare (optimize speed))
- ;;
- (rlet ((p-control-record :ControlRecord))
- (#_FindControl pt-local-to-container (wptr fred-window) p-control-record)
- (%setf-macptr p-control-record (%get-ptr p-control-record))
- (not (%null-ptr-p p-control-record))))
-
-
- ;;; Done.
-
- (provide "F-PT-IN-SCROLL")